
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author igor_ufrn
 */
public class ProdutoDao {

    public Collection<Produto> findProdutos(Integer id, String nome, Integer estoque, Integer codBarras) {

        try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction secondTransaction = session.beginTransaction();

        StringBuilder hqlConsulta = new StringBuilder();
        StringBuilder hqlFiltros = new StringBuilder();

        hqlConsulta.append(" FROM Produto p " +
                           " WHERE 1 = 1 ");
        if( id != null ) {
            hqlFiltros.append(" and  p.id = :id");
        }

        if( nome != null && !nome.equals("") ) {
            hqlFiltros.append(" and  p.nome like :nome ");
        }

        if( estoque != null ) {
            hqlFiltros.append(" and  p.estoque < :estoque ");
        }

        if( codBarras != null ) {
            hqlFiltros.append(" and  p.codigoBarras = :codBarras ");
        }

        hqlConsulta.append(hqlFiltros);
        Query q = session.createQuery(hqlConsulta.toString());        

        if(id != null) {
            q.setInteger("id", id);
        }

        if( nome != null && !nome.equals("") ) {
            q.setString("nome", "%"+nome+"%");
        }

        if(estoque != null) {
            q.setInteger("estoque", estoque);
        }

        if(codBarras != null) {
            q.setInteger("codBarras", codBarras);
        }

        List<Object> objetos = q.list();
        Collection<Produto> produtos = new ArrayList<Produto>();

        for(Object obj : objetos) {
            produtos.add((Produto)obj);
        }

        secondTransaction.commit();
        session.close();

        return produtos;

        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public Collection<Produto> findByCliente(Long idCliente) {

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction secondTransaction = session.beginTransaction();

        String hql = 
                     " from Produto p " +
                     " where p.id in ( " +
                     "                 select p.id " +
                     "                 from ItemVenda iv" +
                     "                 inner join iv.cliente c" +
                     "                 where c.id = :idCliente " +
                     "               ) " ;

        Query q = session.createQuery(hql);
        q.setLong("idCliente", idCliente);

        List<Object> objetos = q.list();
        Collection<Produto> produtos = new ArrayList<Produto>();

        for(Object obj : objetos) {
            produtos.add((Produto)obj);
        }

        secondTransaction.commit();
        session.close();

        return produtos;
    }


    public Collection<Produto> findByFuncionario(Long idFuncionario) {

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction secondTransaction = session.beginTransaction();

        String hql = 
                     " from Produto p " +
                     " where p.id in ( " +
                     "                 select p.id " +
                     "                 from ItemVenda iv" +
                     "                 inner join iv.funcionario c" +
                     "                 where c.id = :idFuncionario " +
                     "               ) " ;

        Query q = session.createQuery(hql);
        q.setLong("idFuncionario", idFuncionario);

        List<Object> objetos = q.list();
        Collection<Produto> produtos = new ArrayList<Produto>();

        for(Object obj : objetos) {
            produtos.add((Produto)obj);
        }

        secondTransaction.commit();
        session.close();

        return produtos;
    }
}